VB操作EXCEL表的常用方法

您所在的位置:网站首页 excel vb快捷键 VB操作EXCEL表的常用方法

VB操作EXCEL表的常用方法

2023-09-13 09:47| 来源: 网络整理| 查看: 265

VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便。因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报表功能。但由于VB与EXCEL由于分别属于不同的应用系统,如何把它们有机地结合在一起,是一个值得我们研究的课题。 一、 VB读写EXCEL表: VB本身提自动化功能可以读写EXCEL表,其方法如下: 1、在工程中引用Microsoft Excel类型库: 从"工程"菜单中选择"引用"栏;选择Microsoft Excel 9.0 Object Library(EXCEL2000),然后选择"确定"。表示在工程中要引用EXCEL类型库。 2、在通用对象的声明过程中定义EXCEL对象: Dim xlApp As Excel.Application Dim xlBook As Excel.WorkBook Dim xlSheet As Excel.Worksheet 3、在程序中操作EXCEL表常用命令: Set xlApp = CreateObject("Excel.Application") '创建EXCEL对象 Set xlBook = xlApp.Workbooks.Open("文件名") '打开已经存在的EXCEL工件簿文件 xlApp.Visible = True '设置EXCEL对象可见(或不可见) Set xlSheet = xlBook.Worksheets("表名") '设置活动工作表 xlApp.Cells(row, col) =值 '给单元格(row,col)赋值 XLApp.Cells(i, 1).Interior.ColorIndex = i'设计单元格颜色i=1--56 xlSheet.PrintOut '打印工作表 xlBook.Close (True) '关闭工作簿 xlApp.Quit '结束EXCEL对象 Set xlApp = Nothing '释放xlApp对象 xlBook.RunAutoMacros (xlAutoOpen) '运行EXCEL启动宏 xlBook.RunAutoMacros (xlAutoClose) '运行EXCEL关闭宏 自己用代码就可以获取颜色列表了  Sub yansecode()  For i = 1 To 56  XlApp.Cells(i, 1) = i  xlapp.Cells(i, 1).Interior.ColorIndex = i  Next  End Sub 4、在运用以上VB命令操作EXCEL表时,除非设置EXCEL对象不可见,否则VB程序可继续执行其它操作,也能够关闭EXCEL,同时也可对EXCEL进行操作。但在EXCEL操作过程中关闭EXCEL对象时,VB程序无法知道,如果此时使用EXCEL对象,则VB程序会产生自动化错误。形成VB程序无法完全控制EXCEL的状况,使得VB与EXCEL脱节。 二、 EXCEL的宏功能: EXCEL提供一个Visual Basic编辑器,打开Visual Basic编辑器,其中有一工程属性窗口,点击右键菜单的"插入模块",则增加一个"模块1",在此模块中可以运用Visual Basic语言编写函数和过程并称之为宏。其中,EXCEL有两个自动宏:一个是启动宏(Sub Auto_Open()),另一个是关闭宏(Sub Auto_Close())。它们的特性是:当用EXCEL打含有启动宏的工簿时,就会自动运行启动宏,同理,当关闭含有关闭宏的工作簿时就会自动运行关闭宏。但是通过VB的自动化功能来调用EXCEL工作表时,启动宏和关闭宏不会自动运行,而需要在VB中通过命令xlBook.RunAutoMacros (xlAutoOpen)和xlBook.RunAutoMacros (xlAutoClose) 来运行启动宏和关闭宏。 三、 VB与EXCEL的相互勾通: 充分利用EXCEL的启动宏和关闭宏,可以实现VB与EXCEL的相互勾通,其方法如下: 在EXCEL的启动宏中加入一段程序,其功能是在磁盘中写入一个标志文件,同时在关闭宏中加入一段删除此标志文件的程序。VB程序在执行时通过判断此标志文件存在与否来判断EXCEL是否打开,如果此标志文件存在,表明EXCEL对象正在运行,应该禁止其它程序的运行。如果此标志文件不存在,表明EXCEL对象已被用户关闭,此时如果要使用EXCEL对象运行,必须重新创建EXCEL对象。 四、举例: 1、在VB中,建立一个FORM,在其上放置两个命令按钮,将Command1的Caption属性改为EXCEL,Command2的Caption属性改为End。然后在其中输入如下程序: Dim xlApp As Excel.Application '定义EXCEL类  Dim xlBook As Excel.Workbook '定义工件簿类 Dim xlsheet As Excel.Worksheet '定义工作表类  Private Sub Command1_Click() '打开EXCEL过程  If Dir("D:\temp\excel.bz") = "" Then '判断EXCEL是否打开 Set xlApp = CreateObject("Excel.Application") '创建EXCEL应用类 xlApp.Visible = True '设置EXCEL可见 Set xlBook = xlApp.Workbooks.Open("D:\temp\bb.xls") '打开EXCEL工作簿 Set xlsheet = xlBook.Worksheets(1) '打开EXCEL工作表 xlApp .Activate '激活工作表 xlApp .Cells(1, 1) = "abc" '给单元格1行驶列赋值 xlBook.RunAutoMacros (xlAutoOpen) '运行EXCEL中的启动宏  Else MsgBox ("EXCEL已打开")   End If End Sub Private Sub Command2_Click()  If Dir("D:\temp\excel.bz") "" Then '由VB关闭EXCEL  xlBook.RunAutoMacros (xlAutoClose) '执行EXCEL关闭宏 xlBook.Close (True) '关闭EXCEL工作簿  xlApp.Quit '关闭EXCEL  End If  Set xlApp = Nothing '释放EXCEL对象  End End Sub 2、在D盘根目录上建立一个名为Temp的子目录,在Temp目录下建立一个名为"bb.xls"的EXCEL文件。 3、在"bb.xls"中打开Visual Basic编辑器,在工程窗口中点鼠标键选择插入模块,在模块中输入入下程序存盘: Sub auto_open()  Open "d:\temp\excel.bz" For Output As #1 '写标志文件  Close #1 End Sub Sub auto_close()  Kill "d:\temp\excel.bz" '删除标志文件 End Sub 4、运行VB程序,点击EXCEL按钮可以打开EXCEL系统,打开EXCEL系统后,VB程序和EXCEL分别属两个不同的应用系统,均可同时进行操作,由于系统加了判断,因此在VB程序中重复点击EXCEL按钮时会提示EXCEL已打开。如果在EXCEL中关闭EXCEL后再点EXCEL按钮,则会重新打开EXCEL。而无论EXCEL打开与否,通过VB程序均可关闭EXCEL。这样就实现了VB与EXCEL的无缝连接。   范例一 Option Explicit Private Sub Command1_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlChar As New Excel.Chart Dim xlSheet As New Excel.Worksheet '建立需要的对象 Set xlApp = New Excel.Application Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("F:\BOOK1.xls") Set xlSheet = xlBook.Worksheets(1) '建立Chart 对象 Set xlChar = xlApp.Charts.Add() xlChar.ChartType = xlLineMarkers Call xlChar.SetSourceData(xlSheet.Range("A1:E7"), xlColumns) '原数据 ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1" ActiveChart.HasLegend = True ActiveChart.Legend.Select Selection.Position = xlRight '选中建立的ChartObjects对象 ActiveSheet.ChartObjects("图表 1").Activate ActiveChart.PlotArea.Select ActiveChart.Legend.Select '删除 退出(&X) 菜单 Dim i As Integer For i = 1 To xlApp.CommandBars("File").Controls.Count Debug.Print xlApp.CommandBars("File").Controls(i).Caption If Left$(xlApp.CommandBars("File").Controls(i).Caption, 2) = "关闭" Then xlApp.CommandBars("File").Controls(i).Visible = False 'Delete Exit For End If Next '显示EXCEL xlApp.Visible = True End Sub

范例二 RichTextBox1 Dim xlApp As Excel.Application Set xlApp = New Excel.Application ---- 然后,可以用这些变量来访问在EXCEL应用程序中的从属对象、以及这些对象的属性和方法。例如: Set xlApp = CreateObject("Excel.Application") ‘激活EXCEL应用程序 xlApp.Visible = False ‘隐藏EXCEL应用程序窗口 Set xlBook = xlApp.Workbooks.Open(strDestination) ‘打开工作簿,strDestination为一个EXCEL报表文件 Set xlSheet = xlBook.Worksheets(1) ‘设定工作表 VB借助EXCEL实现表格设计 1、定义EXCEL对象变量 dim x as excel.application 2、VB中,启动EXCEL set x=createobject("excel.application") 3、新建一个EXCEL工作簿 x.workbooks.add 4、选定工作表1 set xsheet=xbook.worksheets(1) 5、指定单元格,并赋值 xsheet.cell(1,1)=ret.fields(0) 6、指定EXCEL列宽 xsheet.column(1).columnwidth=10 7、RANGE()函数,选定单元格区域 range(cells(1,1),cells(10,20)) 8、设置EXCEL字体 xsheet.range(cells(1,1),cells(10,20)).font.name="黑体" 9、设置EXCEL为粗体 xsheet.range(cells(1,1),cells(10,20)).fontbold=true 10、设置EXCEL表格边框 xsheet.range(cells(1,1),cells(10,20)).borders.linestyle=xlcontinuous 11、运行时,显示EXCEL或隐藏EXCEL x.visible=true 12、保存工作簿 xbook save 13、退出EXCEL x.quit 14、交还控制权给EXCEL set x=nothing 15、打印EXCEL表 x.active.window.selectedsheets.printout copies=numcopies 16、退出EXCEL时,不出现保存提示。 x.displayalerts=false 17、怎样运用EXCEL公式? x.range("A3").formula= "=max(A1,A2)" 18、EXCEL代码获取技巧 打开EXCEL中的工具----宏----录制新宏,然后进行手工操作,结束后把所录的宏代码贴进你的VB程序就行。 19、合并单元格代码 x.range("A2:A5").inergecells=true 20、自动调整列宽代码 x.column("A:I").autofit ' a到 I列自动调整列宽 21、文本自动换行代码 x.rows(3).wraptext=true 22、设置字体颜色 x.rows(1).font.colorindex=4 23、打印预览代码 x.worksheets.printpreview 24、打开EXCEL文件 x.workbooks.open filename:="c:\my documents\my vb \lgx \dy.xls" ======================================================================================== 如何用VB控制EXCEL生成报表 做为一种简捷、系统的 Windows应用程序开发工具,Visual Basic 6 具有强大的数据处理功能,提供了多种数据访问方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多种数据库,被广泛应用于建立各种信息管理系统。但是,VB缺乏足够的、符合中文习惯的数据表格输出功能,虽然使用Crystal Report控件及 Crystal Reports程序可以输出报表,但操作起来很麻烦,中文处理能力也不理想。Excel作为Micorsoft公司的表格处理软件在表格方面有着强大的功能,我们可用VB5编写直接控制Excel操作的程序,方法是用VB的OLE自动化技术获取Excel 2000 的控制句柄,从而直接控制Excel 2000的一系列操作。 下面给出一个实例: 首先建立一个窗体(FORM1)在窗体中加入一个DATA控件和一按钮,引用Microsoft Excel类型库: 从"工程"菜单中选择"引用"栏;选择Microsoft Excel 9.0 Object Library;选择"确定"。 然后在FORM的LOAD事件中加入: Private Sub Form_Load()'数据库及表可以另选,本文以Nwind.mdb为例 Data1.DatabaseName = "C:\Program Files\Microsoft Visual Studio\VB98\Nwind.mdb" Data1.RecordSource = "Customers" Data1.Refresh End Sub 在按钮的CLICK事件中加入 Private Sub Command1_Click() Dim Irow, Icol As Integer Dim Irowcount, Icolcount As Integer Dim Fieldlen() '存字段长度值 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) With Data1.Recordset .MoveLast If .RecordCount < 1 Then MsgBox ("Error 没有记录!") Exit Sub End If Irowcount = .RecordCount '记录总数 Icolcount = .Fields.Count '字段总数 ReDim Fieldlen(Icolcount) .MoveFirst For Irow = 1 To Irowcount + 1 For Icol = 1 To Icolcount Select Case Irow Case 1 '在Excel中的第一行加标题 xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1).Name Case 2 '将数组FIELDLEN()存为第一条记录的字段长 If IsNull(.Fields(Icol - 1)) = True Then Fieldlen(Icol) = LenB(.Fields(Icol - 1).Name) '如果字段值为NULL,则将数组Filelen(Icol)的值设为标题名的宽度 Else Fieldlen(Icol) = LenB(.Fields(Icol - 1)) End If xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol) 'Excel列宽等于字段长 xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1) '向Excel的CellS中写入字段值 Case Else Fieldlen1 = LenB(.Fields(Icol - 1)) If Fieldlen(Icol) < Fieldlen1 Then xlSheet.Columns(Icol).ColumnWidth = Fieldlen1 '表格列宽等于较长字段长 Fieldlen(Icol) = Fieldlen1 '数组Fieldlen(Icol)中存放最大字段长度值 Else xlSheet.Columns(Icol).ColumnWidth = Fieldlen(Icol) End If xlSheet.Cells(Irow, Icol).Value = .Fields(Icol - 1) End Select Next If Irow 1 Then If Not .EOF Then .MoveNext End If Next With xlSheet .Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Name = "黑体" '设标题为黑体字 .Range(.Cells(1, 1), .Cells(1, Icol - 1)).Font.Bold = True '标题字体加粗 .Range(.Cells(1, 1), .Cells(Irow, Icol - 1)).Borders.LineStyle = xlContinuous '设表格边框样式 End With xlApp.Visible = True '显示表格 xlBook.Save '保存 Set xlApp = Nothing '交还控制给Excel End With End Sub 本程序在中文Windows98、中文VB6下通过。   =================================================== VB5.0调用Office97技巧 Visual Basic 5.0具有简单、易学等特点,深受初学者的欢迎,但也有一些不如人意的地方。例如,不能像Word 97那样进行拼写检查,不能像Excel 97那样具有很多的函数。如果我们能将Word 97和Exce l97的功能使用在Visual Basic 5.0中,就可以使VB达到锦上添花的目的。 我们知道所有Office 97 应用程序都提供了ActiveX对象,我们可以在Visual Basic 5.0中使用它们调用Word 97 要想在VB中调用Word 97,首先要打开VB的"工程"菜单中的"引用"项目,并在该项目对话框中选定"Microsoft Word 8.0 Object Library"就可以了。 下面我们举例说明调用Word 97中的"拼写检查"和"单词统计"功能。首先新建一个工程并在窗体上放置一个TextBox控件和两个CommandButton控件,然后添入如下的代码:  Option Explicit  Dim Doc As New Document  Dim Visi As Boolean ′拼写检查  Private Sub Command1-Click()  Form1.Caption = "拼写检查"  Doc.Range.Text = Text1 ′确定范围  Doc.Application.Visible = True ′将Word 97变为可见  AppActivate Doc.Application.Caption ′激活Word 97  Doc.Range.CheckSpelling ′拼写检查  Text1 = Doc.Range.Text  Text1 = Left(Text1, Len(Text1) - 1)  AppActivate Caption  End Sub  ′统计单词数  Private Sub Command2-Click()  Dim Dlg As Word.Dialog  Doc.Range = Text1.Text  Set Dlg = Doc.Application.Dialogs  (wdDialogDocumentStatistics)  Dlg.Execute ′统计单词和字符  Form1.Caption ="单词数:" & Str(Dlg.Words) & "词"  & Str(Dlg.Characters) & "字符" ′显示统计结果  End Sub Top 范例三  Private Sub Form-Load()  Form1.Caption ="调用Word 97"  Text1.Text = ""  Command1.Caption = "拼写检查"  Command2.Caption = "统计单词"  ′使应用程序可见  Visi = Doc.Application.Visible  End Sub  ′关闭应用程序  Private Sub Form-Unload(Cancel As Integer)  If Visi Then ′关闭文件  Doc.Close savechanges:=False  Else  Doc.Application.Quit savechanges:=False ′关闭 Word 97  End If  End Sub 调用Excel 97 使用Excel Sheet对象的技术可以处理可变数量的数据,并将结果最后送到你的Visual Basic 应用程序中。例子如下: 新建一个工程并在新建的窗体上放置两个TextBox控件和一个CommandButton控件及六个Label控件。建设中的窗体如图2所示。 程序代码如下:  Option Explicit  Private Sub Command1-Click()  Dim xObject As Object  ′调用Excel 97  Set xObject = CreateObject("Excel.Sheet")  Set xObject = xObject.Application.ActiveWorkbook.ActiveSheet  xObject.Range("A1").Value = Text1.Text ′将数值送入Excel 97的A1单元格  xObject.Range("A2").Value = Text2.Text ′将数值送入Excel 97的A2单元格  xObject.Range("A3").Formula = "=MAX(A1,A2)" ′将最大值送入A3单元格  xObject.Range("A4").Formula = "=ATAN(A1/A2)*180/PI()" ′将反正切值送入A4单元格  ′显示计算的结果  Label1.Caption = xObject.Range("A3").Value  Label2.Caption = xObject.Range("A4").Value  Set xObject = Nothing  End Sub  Private Sub Form_Load()  Text1.Text = "" Text2.Text = "" Label1.Caption = "" Label2.Caption = "" End Sub 该程序的作用是:首先在两个文本框(Text1和Text2)输入数值并分别将输入的数值送入Excel 97的"A1"和"A2"单元格中,然后用Excel 97中的"Max()"函数将计算的结果送入"A3" 单元格中;用反正切函数"ATAN()"进行计算并将结果送入"A4" 单元格中,最后输出。 0 Then  ifNum = 1  Else  ifNum = 2  End If  End If  Select Case ifNum  Case 2  Exit Sub  Case 0  Select Case Opt '  选择需要打印的表格  Case 1  myrecordset1.MoveFirst  n = (BeginPage - 1) *  (49 - 4 + 1) - 1  myrecordset1.Move n  PageN = BeginPage  Call ExcelDoForVB1   '数据填入Excel单元格并打印  Case 2  ……  ……  End Select   Case 1  Select Case Opt   '选择需要打印的表格  Case 1  myrecordset1.MoveFirst  n = (BeginPage - 1) *  (49 - 4 + 1) - 1  myrecordset1.Move n  PageN = BeginPage  For nBtoE = BeginPage To EndPage  Call ExcelDoForVB1   '填入Excel单元格并打印  PageN = PageN + 1  Next nBtoE  Case 2  ……  ……  End Select  End Select  End If  End If  FrmMain.Visible = True  Exit Sub  errhandle:  FrmPrint.Visible = False  FrmMain.Visible = True  End Sub ---- 注意,下段仅通过ExcelDoForVB1()对"报表(一)"的处理,来说明数据填入Excel并打印的整个过程。  Sub ExcelDoForVB1()  '打印报表(一)  FrmPrint.Visible = True  Set exsheet = exwbook.Worksheets("sheet1")  ex.Sheets("Sheet1").Select  ex.Range("A4:U49").Select  ex.Selection.ClearContents  ex.Range("A4").Select  bar1.Min = 0  bar1.Max = 45   For nRow = 4 To 49  bar1.Value = nRow - 4 '进度显示栏进程  myrecordset1.MoveNext  If myrecordset1.EOF Then  nflag = 0  Exit For  End If  For nCol = 1 To 21  exsheet.Cells(nRow, nCol) =  myrecordset1.Fields(nCol - 1)  Next nCol  Next nRow  exsheet.Cells(52, 21) = "第 " + CStr(PageN) + " 页"  FrmPrint.Visible = False  bar1.Value = 0  ActiveWindow.SelectedSheets.PrintOut Copies:=NumCopies  End Sub ---- 虽然本文针对的是大多数已熟练掌握数据库技术,且精通编程之道的朋友们。但笔者认为仍有必要提一提将数据输入Access的过程,因为编出来的软件更多是面向各类普通用户,对他们来说最要紧的是好用,而其间的一系列关联并不想深究。所以设计一个好的输入界面十分有必要,在设计时可以运用VB提供的Data控件,当然若是考虑性能的话还可以用代码直接操纵数据。关于如何使用Data控件访问数据库,在Visual Basic的联机手册(Online book)中有很详细的说明,此处不再赘述。  ---- 文中的所有程序在Visual Bsaic5.0中文专业版及Office97中文版中调试通过。  ---- 例如合并A2~A5这4个单元格,你录制的宏代码会是这样:  Range("A2:A5").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With Selection.Merge ---- 而自己编程只要一句 Range.(“A2:A5”).mergecells=True 就可以解决问题。  ---- 表头形式定了,再就是表头的内容。如果单元格中的文本长度超过了列宽,往往只能显示部分内容,行尾那一格的内容则会“越境”进入右边那个空白单元格,很不美观。这个问题可以通过在程序中设置列宽加以解决。  ---- Columns(14).columnwidth=12 ‘设置第14列列宽为12(缺省列宽为8.38)  ---- 如果你不愿意劳神去逐列估计实际所需的列宽,干脆来一行  ---- Columns(“a:i”).autofit ‘a到i列自动调整列宽  ---- 让Excel随机应变吧。  ---- 但也许你不喜欢这种方法,认为表头撑大了列宽,弄得浏览一张小表格还得向右滚动,太不方便了。要是能保持默认列宽,让文本自动换行就好了。没问题,Excel包你满意。  ---- Rows(3).WrapText=True ‘让第三行各单元格中的文本自动换行  ---- 不过你最好再加一句 Rows(3) .VerticalAlignment = xlTop 让表头自动向上对齐,这样比较符合习惯。  ---- 你还可以给表头打上底色,让你的读者不至于看了打哈欠。  ---- Rows(2). Interior .ColorIndex = 5 '设置第2行底色为蓝色  ---- 再给表格的标题上色,这样更醒目一点。  ---- Rows(1).Font.ColorIndex=4  ---- 表头完成后该填数据了,一个一个地填实在是太慢了,如果你的数据是存放在一个二维数组中,那问题就简单多了。  Dim Data(3,4) ………… ‘数据处理 Range(“a2:d4”).Value=Data ---- 这样可以一次填入一个表的所有数据,够快了吧!不过提醒一句,Range对象大小最好与数组匹配,小了无法显示所有数据,大了则会在空白单元格只填入“N/A”表示没有取  用EXCEL来打印报表并生成折线图 Private Sub PrintFunc()  on error goto PrintFunc_Err  Dim Ct As Object  Set ex = CreateObject("Excel.Application")  '增加工作表  ex.Workbooks.Add  '输出数据  ex.Range("A1").Value = "系列1"  ex.Range("A2").Value = 8  ex.Range("A3").Value = 16  ex.Range("A4").Value = 7  ex.Range("A5").Value = 22  ex.Range("A6").Value = 13  ex.Range("A7").Value = 15  ex.Range("A8").Value = 11  ex.Range("B1").Value = "系列2"  ex.Range("B2").Value = 5  ex.Range("B3").Value = 6  ex.Range("B4").Value = 17  ex.Range("B5").Value = 10  ex.Range("B6").Value = 3  ex.Range("B7").Value = 9  ex.Range("B8").Value = 16  '设定表格样式  ex.Range("A1", "B8").Borders.LineStyle = xlContinuous  ex.Cells(, 1).ColumnWidth = 25  ex.Cells(, 2).ColumnWidth = 25  ’插入折线图  Set Ct = ex.Worksheets("sheet1").ChartObjects.Add(0, 130, 350, 250)  Ct.Chart.ChartWizard Source:=ex.Worksheets("sheet1").Range("A2:B8"), _  gallery:=xlLine, Title:="New Chart"  ex.Visible = True  '打印预揽  ex.ActiveWindow.SelectedSheets.PrintPreview  '关闭EXCEL  ex.Visible = False  ex.Worksheets("sheet1").ChartObjects.Delete  ex.ActiveWorkbook.Close savechanges:=False  PrintFunc_Err:  Set ex = Nothing  Set Ct = Nothing  end Sub   在现代管理信息系统的开发中,经常涉及到数据信息的分析、加工,最终还需把统计结果形成各种形式的报表提供给领导决策参考,或进行外部交流。在VisualBasic中制作报表,通常是用数据环境设计器(Data EnvironmentDesigner)与数据报表设计器(DataReportDesigner),或者使用第三方产品来完成。但对于大多数习惯于Excel报表的用户而言,用以上方法生成的报表在格式和功能等方面往往不能满足他们的要求。 由于Excel具有自己的对象库,在VisualBasic工程中可以加以引用,通过对Excel使用OLE自动化,可以创建一些外观整洁的报表,然后打印输出。这样实现了VisualBasi应用程序对Excel的控制。本文将针对一个具体实例,阐述基于VB和EXCEL的报表设计及打印过程。 1)创建Excel对象 Excel对象模型包括了128个不同的对象,从矩形、文本框等简单的对象到透视表,图表等复杂的对象。下面简单介绍一下其中最重要,也是用得最多的五个对象。 (1)Application对象 Application对象处于Excel对象层次结构的顶层,表示Excel自身的运行环境。 (2)Workbook对象 Workbook对象直接地处于Application对象的下层,表示一个Excel工作薄文件。 (3)Worksheet对象 Worksheet对象包含于Workbook对象,表示一个Excel工作表。 (4)Range对象 Range对象包含于Worksheet对象,表示Excel工作表中的一个或多个单元格。 (5)Cells对象 Cells对象包含于Worksheet对象,表示Excel工作表中的一个单元格。如果要启动一个Excel,使用Workbook和Worksheet对象,下面的代码启动了Excel并创建了一个新的包含一个工作表的工作薄: DimzsbexcelAsExcel.Application Setzsbexcel=NewExcel.Application zsbexcel.Visible=True 如要Excel不可见,可使zsbexcel.Visible=False zsbexcel.SheetsInNewWorkbook=1 Setzsbworkbook=zsbexcel.Workbooks.Add 2)设置单元格和区域值 要设置一张工作表中每个单元格的值,可以使用Worksheet对象的Range属性或Cells属性。 Withzsbexcel.ActiveSheet .Cells(1,2).Value="100" .Cells(2,2).Value="200" .Cells(3,2).Value="=SUM(B1:B2)" .Range("A3:A9")="中国人民解放军" EndWith 要设置单元格或区域的字体、边框,可以利用Range对象或Cells对象的Borders属性和Font属性: Withobjexcel.ActiveSheet.Range("A2:K9").Borders'边框设置 .LineStyle=xlBorderLineStyleContinuous .Weight=xlThin .ColorIndex=1 EndWith Withobjexcel.ActiveSheet.Range("A3:K9").Font'字体设置 .Size=14 .Bold=True .Italic=True .ColorIndex=3 EndWith 通过对Excel单元格和区域值的各种设置的深入了解,可以创建各种复杂、美观、满足需要的、具有自己特点的报表。 3)预览及打印 生成所需要的工作表后,就可以对EXCEL发出预览、打印指令了。 zsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait' 设置打印方向 zsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4' 设置打印纸的打下 zsbexcel.Caption="打印预览"'设置预览窗口的 标题 zsbexcel.ActiveSheet.PrintPreview'打印预览 zsbexcel.ActiveSheet.PrintOut'打印输出 通过打印方向、打印纸张大小的设置,不断进行预览,直到满意为止,最终进行打印输出。 为了在退出应用程序后EXCEL不提示用户是否保存已修改的文件,需使用如下语句: zsbexcel.DisplayAlerts=False zsbexcel.Quit'退出EXCEL zsbexcel.DisplayAlerts=True 如此设计的报表打印是通过EXCEL程序来后台实现的。对于使用者来说,根本看不到具体过程,只看到一张张漂亮的报表轻易地被打印出来了。 4)具体实例 下面给出一个具体实例,它在window98、VisualBasic6.0、 MicrosoftOffice97的环境下调试通过。 在VB中启动一个新的StandardEXE工程,在“工程”菜单的“引用”选项下引用ExcelObjectLibrary然后在Form中添加一个命令按钮cmdExcel最后在窗体中输入如下代码: DimzsbexcelAsExcel.Application PrivateSubcmdExcel_Click() Setzsbexcel=NewExcel.Application zsbexcel.Visible=True zsbexcel.SheetsInNewWorkbook=1 Setzsbworkbook=zsbexcel.Workbooks.Add Withzsbexcel.ActiveSheet.Range("A2:C9").Borders'边框设置 .LineStyle=xlBorderLineStyleContinuous .Weight=xlThin .ColorIndex=1 EndWith Withzsbexcel.ActiveSheet.Range("A3:C9").Font'字体设置 .Size=14 .Bold=True .Italic=True .ColorIndex=3 EndWith zsbexcel.ActiveSheet.Rows.HorizontalAlignment= xlVAlignCenter'水平居中 zsbexcel.ActiveSheet.Rows.VerticalAlignment= xlVAlignCenter'垂直居中 Withzsbexcel.ActiveSheet .Cells(1,2).Value="100" .Cells(2,2).Value="200" .Cells(3,2).Value="=SUM(B1:B2)" .Cells(1,3).Value="中国人民解放军" .Range("A3:A9")="50" EndWith zsbexcel.ActiveSheet.PageSetup.Orientation=xlPortrait' xlLandscape zsbexcel.ActiveSheet.PageSetup.PaperSize=xlPaperA4 zsbexcel.ActiveSheet.PrintOut zsbexcel.DisplayAlerts=False zsbexcel.Quit zsbexcel.DisplayAlerts=True Setzsbexcel=Nothing      Excel表格生成和公式设置十分强大便利,是一个强有力的信息分析与处理工具。Visual Basic是一套可视化、面向对象、事件驱动方式的结构化高级程序设计语言,正成为高效率的Windows应用程序开发工具。 由于微软的努力,Visual Basic应用程序版可作为一种通用宏语言被所有微软可编程应用软件共享。   Excel面始之初带有表格处理类软件中功能最强的宏语言,通过单击“工具”菜单中的“宏”,选择宏名来调用宏过程。随后发展至Visual Basic for Application专用版,可制作按钮、复选框、单选钮等控件,赋控件以宏名,单击控件运行宏,事件驱动方式就Click(单击)一种。新近推出的Office97套件中的Excel97,在“工具”菜单中选择“宏”后,就会发现增加了“Visual Basic编辑器”功能。运用这个新增功能,就完全与Visual Basic编程无异了。在菜单栏上单击鼠标右键,选择弹出式菜单中的“控件工具箱”,在“控件工具箱”工具条上,单击待添加的控件按钮,在工作表中将控件拖曳到所需位置和大小,单击鼠标右键选中“属性”设置控件属性后,双击控件就会出现Visual Basic编辑器。选择该控件的一个事件如Click或Change,编写程序。在工作表中操作该控件,如鼠标单击、键入字符等,则触发相应事件,执行相应程序。   笔者在Excel97平台,采用Visual Basic应用程序版开发了一套“通用报表分析系统”。该系统用于拥有众多子公司的母公司的每月财务报表合并汇总。所有子公司的统计报表如资产负债表、损益表是由FoxBase编制的财务软件生成的dbf文件,取名为ATV001xx.dbf----xx月份资产负债表,ATV002xx.dbf----xx月份损益表等。一个子公司的所有dbf文件放在一个单独的目录中,如C:\T\palm1,C:\T\palm2等。母公司每月份生成的汇总报表为TTTyymm.xls(yy----年份,mm----月份),它有“资产负债表”、“损益表”等若干工作表组成。每张工作表是由所有子公司相应的dbf文件的相应项目的数据相加而成。只要将dbf文件逐一转化到TTTyymm.xls中去,很容易利用Excel的公式设置功能生成母公司的每张汇总报表。  这套系统的关键在于如何将所有dbf文件转换到同一个Excel工作簿中。直接通过“文件”菜单中的“打开”项, 选择文件类型为dBase文件(*.dbf), 可将dbf文件转换到Excel工作簿中,但这工作簿只存转换而来的一张工作表,其他表都自动关闭了。另外,通过“工具”菜单中的“向导”,选择“文件转换”后, 只是将一系列dbf文件转换为一系列xls文件而已。于是采用建立ODBC数据源获取外部数据的办法, 将dbf文件逐一转换到一个Excel工作簿内, 且用Visual Basic for Application将转换过程自动化。只要按一下图1中的“生成报表”按钮, 就能完成所有dbf 文件的转换, 且利用Excel公式自动计算功能完成所有报表的汇总计算。按“显示报表”按钮,选择表名,可以浏览报表数据。  具体的方法是:  一、 建立ODBC数据源  (1) 打开“数据”菜单, 选择“获取外部数据”, 然后单击“新建查询”;  (2) 在“选择数据源”对话框中, 双击“”;  (3) 出现“创建新数据源”对话框,输入数据源名称, 选择驱动程序如Microsoft dBase Driver(*.dbf), 单击“连接”;  (4) 在“ODBC dBase安装”对话框中, 单击“使用当前工作目录”前的复选框, 去掉缺省( , 单击“选定目录(s)”, 选择子公司存放dbf文件的目录如C:\T\palm1, 连按“确定”;  (5) 当出现Microsoft Quary对话框时, 单击“关闭”, 退出。不要理会出现的警示信息,因为此时只需建立数据源, 并不需要用Microsoft Query查询数据;  (6) 重复上述步骤, 在(4)中改换另一家子公司的目录, 就为另一家子公司建立一个数据源。必须建立所有子公司的数据源。  二、手动获取外部数据  (1) 单击“数据”,选取“获取外部数据”,单击“新建查询”;  (2) 出现“选取数据源”对话框,点中“使用查询向导创建/ 编辑查询”前的复选框,然后双击数据源名,如palm1;  (3) 在“查询向导——选择列”对话框中选择一个查询表名,单击 > 键,“查询中用到的列”框内会出现表中所有列名,单击“下一步”;  (4) 出现“查询向导——过滤数据”,单击“下一步”;  (5) 出现“查询向导——排序顺序”,单击“下一步”;  (6) 出现“查询向导——完成”,点中“将数据返回Microsoft Excel”前的单选钮,单击“完成”;  (7) 出现“将外部数据返回到Excel”对话框,选中“新建工作表”,按“确定”;  (8) 在建立查询的工作簿内新建工作表,并放入转换好的数据。这样就将一个 dbf 文件转换好了。  (9)重复上述过程,所有子公司的dbf文件转换到同一个工作簿中。  三、 使用VB实现Excel自动获取外部数据  (1) 进行手动获取外部数据(1)步骤前,单击“工具”菜单中的“宏”,选择“录制新宏”,在“宏名”的编辑框中键入宏名dbftoxls,按“确定”键;  (2) 完成手动获取外部数据(1)-(8)步骤;  (3) 单击“工具”菜单中的“宏”,选择“停止录制”。这样就将获取外部数据的过程记录为宏。  (4) 编辑dbftoxls宏,加以修改,使它作为Visual Basic模块表中的一个子程序,并设置调用参数。  提供的程序如下:  `设置初值  Const apppath = "c:\my documents\palmxls\"  Const modulefile = apppath + "module.xls"  Const staticspre = "TTT"  Const dbfpre = "ATV00"  `调用dbftoxls的模块  Private Sub Cmdgeneratetable_Click()  Dim staticsfile As String  Dim s1 As String  Dim s2 As String  Dim s3 As String  Dim idyes As Integer  Dim dbfstring As String  On Error GoTo errhandler1  idyes = 6  s1 = txtyear.Text  s1 = Mid(s1, 3, 2)  s2 = txtmonth.Text  If Len(s2) = 1 Then  s2 = "0" + s2  End If  staticsfile = apppath + staticspre + s1 + s2 + ".xls"  If FileLen(staticsfile) > 0 Then  choice = MsgBox("该年月报表已存在,是否重新生成?", vbYesNo + vbExclamation + vbDefaultButton1, "")  If choice = idyes Then  Workbooks.Open FileName:=staticsfile  For i = 0 To companynum - 1  For j = 0 To tablenum - 1  dbfstring = dbfpre + Trim(Str$(j + 1)) + s2  sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j))  Call dbftoxls(s(i, j), sqlstring)  Next j  Next i  ActiveWorkbook.Save  ActiveWorkbook.Close  End If  End If  Exit Sub  errhandler1:  Select Case Err  Case 53  Workbooks.Open FileName:=modulefile  s3 = s1 + "年" + s2 + "月"  Sheets("资产负债表").Range("e4").FormulaR1C1 = "'" + s3  ActiveWorkbook.SaveAs FileName:=staticsfile, FileFormat _  :=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _  False, CreateBackup:=False  For i = 0 To companynum - 1  For j = 0 To tablenum - 1  dbfstring = dbfpre + Trim(Str$(j + 1)) + s2  sqlstring = sqlstringfunc(dbfstring, fieldlist(), tablefieldnum(j))  Call dbftoxls(s(i, j), sqlstring)  Next j  Next i  ActiveWorkbook.Save  ActiveWorkbook.Close  End Select  End Sub  `dbftoxls子程序  Sub dbftoxls(activesheetname, sqlstring)  Sheets(activesheetname).Activate  Cells.Select  Selection.Clear  Range("a1").Select  With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _  "ODBC;CollatingSequence=ASCII;DBQ=C:\T\palm1;DefaultDir=C:\T  \palm1;Deleted=1;Driver={Microsoft dBase Driver (*.dbf)};DriverId=533;FIL"  ), Array( _  "=dBase III;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=  8;PageTimeout=600;SafeTransactions=0;Statistics=0;Threads=3;Use" _  ), Array("rCommitSync=Yes;")), Destination:=Range("A1"))  .Sql = Array( sqlstring)  .FieldNames = True  .RefreshStyle = xlInsertDeleteCells  .RowNumbers = False  .FillAdjacentFormulas = False  .RefreshOnFileOpen = False  .HasAutoFormat = True  .BackgroundQuery = True  .TablesOnlyFromHTML = True  .Refresh BackgroundQuery:=False  .SavePassword = True  .SaveData = True  End With  End Sub

vb 判断 已打开的EXCEL表格 是否被关闭  悬赏分:15 - 提问时间2009-2-12 10:09 问题为何被关闭  一个FORM中  有按钮及TEXT若干  其中一个按钮可以调用EXCEL 要求 VB能自动判断   1、当EXCEL被打开后  该FORM上 所有控件的Endabled=False 2、当EXCEL被各种原因关闭后  该FORM上 所有控件的Endabled=True  提问者: awpawpak47 - 魔法学徒 一级  答复    共 1 条 检举 你可以在打开Excel后加入代码,让控件Endabled=False ,再操作完后,释放Excel后再将控件Endabled=True 比如: Dim objExcel As Excel.Application Dim objWorkBook As Excel.Workbook

Set objExcel = CreateObject("Excel.Application") Set objWorkBook = objExcel.Workbooks.Open("d:\1.xls")  objExcel.Visible = False

'设置活动工作表 Dim objSheet As Excel.Worksheet Set objSheet = objExcel.Worksheets("sheet1")

Command2.Endabled=False '等等 objSheet.Cells(2, 1) = "mather"  '中间操作

objWorkBook.Save objWorkBook.Close



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3